package com.gitee.cui.redis.jedis;

import com.gitee.cui.util.Logger;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import redis.clients.jedis.Jedis;

/**
 * 通过Jedis客户端，操作String类型数据
 * @author cuiqingqiang
 * @version 1.0
 * @date 2021/11/7 17:58
 **/
@Slf4j
public class StringTest {

    private static final String KEY = "key0";

    @Test
    public void stringTest() {
        Jedis jedis = new Jedis("localhost", 6379);
        // 连接成功返回PONG
        log.info("jedis ping: " + jedis.ping());
        // 设置值
        jedis.set(KEY, "123456");
        // 获取数据类型
        log.info("jedis type: " + jedis.type(KEY));
        // 获取值
        log.info("jedis value: " + jedis.get(KEY));
        // 是否存在key
        log.info("jedis key0 exists: " + jedis.exists(KEY));
        // 返回key的长度
        log.info("jedis length: " + jedis.strlen(KEY));
        // 返回截取字符串的范围，0,-1表示截取全部
        log.info("jedis.lrange(key0): " + jedis.getrange(KEY, 0, -1));
        // 返回截取字符串，范围1,4表示[1,4]
        log.info("jedis.getrange(key0, 1, 4): " + jedis.getrange(KEY, 1, 4));

        // 追加
        log.info("jedis.append(key0): " + jedis.append(KEY, "appendStr"));
        log.info("jedis.get(key0): " + jedis.get(KEY));

        // 重命名
        jedis.rename(KEY, "key0_new");
        // 判断key 是否存在
        log.info("jedis.exists(key0): " + jedis.exists(KEY));

        // 批量插入
        jedis.mset("key1", "val1", "key2", "val2", "key3", "100");
        // 批量取出
        log.info("jedis.mget(key1,key2,key3): " + jedis.mget("key1", "key2", "key3"));
        // 删除
        log.info("jedis.del(key1): " + jedis.del("key1"));
        log.info("jedis.exists(key1): " + jedis.exists("key1"));
        // 取出旧值 并set新值
        log.info("jedis.getSet(key2): " + jedis.getSet("key2", "value3"));
        // 自增1 要求数值类型
        log.info("jedis.incr(key3): " + jedis.incr("key3"));
        // 自增15 要求数值类型
        log.info("jedis.incrBy(key3): " + jedis.incrBy("key3", 15));
        // 自减1 要求数值类型
        log.info("jedis.decr(key3): " + jedis.decr("key3"));
        // 自减5 要求数值类型
        log.info("jedis.decrBy(key3): " + jedis.decrBy("key3", 15));
        // 增加浮点类型
        log.info("jedis.incrByFloat(key3): " + jedis.incrByFloat("key3", 1.1));

        // 返回0 只有在key不存在的时候才设置
        log.info("jedis.setnx(key3): " + jedis.setnx("key3", "existVal"));
        log.info("jedis.get(key3): " + jedis.get("key3"));// 3.1

        // 只有key都不存在的时候才设置,这里返回 null
        log.info("jedis.msetnx(key2,key3): " + jedis.msetnx("key2", "exists1", "key3", "exists2"));
        log.info("jedis.mget(key2,key3): " + jedis.mget("key2", "key3"));

        // 设置key 2 秒后失效
        jedis.setex("key4", 2, "2 seconds is no Val");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 2 seconds is no Val
        log.info("jedis.get(key4): " + jedis.get("key4"));

        jedis.set("key6", "123456789");
        // 下标从0开始，从第三位开始,将新值覆盖旧值
        jedis.setrange("key6", 3, "abcdefg");
        // 返回：123abcdefg
        log.info("jedis.get(key6): " + jedis.get("key6"));

        // 返回所有匹配的key
        Logger.info("jedis.get(key*): " + jedis.keys("key*"));

        jedis.close();
    }
}
